package com.quick.develop.flowable.service.task;

import com.quick.develop.flowable.domain.dto.task.BpmTaskDTO;
import com.quick.develop.flowable.domain.vo.system.SysUserDeptVO;
import com.quick.develop.flowable.domain.vo.task.BpmTaskReqVO;
import com.quick.develop.framework.common.page.PageResult;
import com.quick.develop.framework.utils.collection.CollectionUtils;
import com.quick.develop.flowable.domain.task.*;
import org.flowable.bpmn.model.UserTask;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author junyuan.liu
 * @description: 流程任务实例 Service 接口
 * @date 2022/4/25 16:23
 */
public interface IBpmTaskService {

    /**
     * @param processInstanceId 流程实例ID
     * @return org.flowable.task.api.Task
     * @description 获得流程任务
     * @author junyuan.liu
     * @date 2022/5/11 15:52
     */
    Task getTaskByProcessInstanceId(String processInstanceId);

    /**
     * @param processInstanceId 流程实例ID
     * @return java.util.List<org.flowable.task.api.Task>
     * @description 获得流程任务列表
     * @author junyuan.liu
     * @date 2022/6/6 14:45
     */
    List<Task> getTasksByProcessInstanceId(String processInstanceId);

    /**
     * @param processInstanceId 流程实例ID
     * @return java.util.List<org.flowable.task.api.history.HistoricTaskInstance>
     * @description 获取已结束的任务
     * @author junyuan.liu
     * @date 2022/8/11 13:37
     */
    List<HistoricTaskInstance> getTasksFinishedByProcessInstanceId(String processInstanceId);


    /**
     * @param processInstanceIds 流程实例的编号数组
     * @return
     * @description 获得流程任务列表
     * @author junyuan.liu
     * @date 2022/4/25 16:24
     */
    List<Task> getTasksByProcessInstanceIds(Collection<String> processInstanceIds);

    /**
     * @param processInstanceIds 流程实例的编号数组
     * @return
     * @description 获得流程任务 Map
     * @author junyuan.liu
     * @date 2022/4/25 16:25
     */
    default Map<String, List<Task>> getTaskMapByProcessInstanceIds(Collection<String> processInstanceIds) {
        return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds),
                Task::getProcessInstanceId);
    }

    /***
     * @description 获取任务
     * @param id 任务ID
     * @return
     * @author junyuan.liu
     * @date 2022/4/28 9:51
     */
    Task getTaskById(String id);

    /**
     * @param id executionID
     * @return org.flowable.task.api.Task
     * @description 根据executionID 获取任务
     * @author junyuan.liu
     * @date 2022/7/1 16:11
     */
    Task getTaskByExecutionId(String id);

    /**
     * @param id 任务ID
     * @return org.flowable.task.api.history.HistoricTaskInstance
     * @description 获取历史任务
     * @author junyuan.liu
     * @date 2022/6/30 16:17
     */
    HistoricTaskInstance getHistTaskById(String id);

    /**
     * @param taskVo 请求实体参数
     * @return java.util.List<org.flowable.bpmn.model.UserTask>
     * @description 获取可退回的节点
     * @author junyuan.liu
     * @date 2022/5/2 11:09
     */
    List<UserTask> findReturnTaskList(@Valid BpmTaskReqVO taskVo);


    /***
     * @description 代办分页
     * @param pageVO 请求参数
     * @return 代表分页
     * @author junyuan.liu
     * @date 2022/4/28 13:52
     */
    PageResult<BpmTaskTodoPageItemRespVO> getTodoTaskPage(BpmTaskTodoPageReqVO pageVO);

    /**
     * @return java.lang.Integer
     * @description 获取代办数量
     * @author junyuan.liu
     * @date 2022/7/28 17:20
     */
    long getTodoCount();

    /***
     * @description 已办分页
     * @param pageVO 请求参数
     * @return 已办分页
     * @author junyuan.liu
     * @date 2022/4/28 14:59
     */
    PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage(BpmTaskDonePageReqVO pageVO);

    /**
     * @param pageVO pageVO
     * @return com.quick.develop.framework.domain.PageResult<com.quick.develop.flowable.domain.task.BpmTaskDonePageItemRespVO>
     * @description 新已办查询
     * @author junyuan.liu
     * @date 2023/12/27 14:33
     */
    PageResult<BpmTaskDonePageItemRespVO> getDoneTaskPage2(BpmTaskDonePageReqVO pageVO);

    /**
     * @return long
     * @description 获取已办数量
     * @author junyuan.liu
     * @date 2022/10/15 13:44
     */
    long getDoneCount();

    /**
     * @param id       任务ID
     * @param assignee 要更改的人
     * @description 更改任务人
     * @author junyuan.liu
     * @date 2022/5/7 16:01
     */
    void assign(String id, String assignee);


    /**
     * @param processInstanceId 流程实例的编号
     * @return java.util.List<org.flowable.task.api.history.HistoricTaskInstance>
     * @description 获得指令流程实例的流程任务列表，包括所有状态的
     * @author junyuan.liu
     * @date 2022/5/2 14:41
     */
    List<BpmTaskRespVO> getTaskListByProcessInstanceId(String processInstanceId);

    /**
     * @param businessKey 业务key
     * @return java.util.List<org.flowable.task.api.Task>
     * @description 通过实例businessKey获取到任务
     * @author junyuan.liu
     * @date 2022/5/12 13:10
     */
    List<Task> getTaskListByBusinessKey(String businessKey);

    /**
     * @param businessKey businessKey
     * @return java.util.List<com.quick.develop.flowable.domain.dto.task.BpmTaskDTO>
     * @description
     * @author junyuan.liu
     * @date 2023/12/26 11:08
     */
    List<BpmTaskDTO> getRuTaskListByBusinessKey(String businessKey);


    /**
     * @param reqVO 请求体
     * @return java.util.List<org.flowable.bpmn.model.UserTask>
     * @description 获取下一个节点集合
     * @author junyuan.liu
     * @date 2022/6/28 10:39
     */
    List<UserTask> getNextTaskList(BpmTaskReqVO reqVO);

    /**
     * @param processInstanceId 流程实例ID
     * @param taskDefKey        退回节点的节点ID
     * @return java.lang.String
     * @description 获取退回节点的审批人
     * @author junyuan.liu
     * @date 2022/7/30 15:37
     */
    String getSingleBackAssignee(String processInstanceId, String taskDefKey);

    /**
     * @param ids 任务ID
     * @return java.util.Set<java.lang.String>
     * @description 获取候选组Id集合
     * @author junyuan.liu
     * @date 2022/8/22 18:48
     */
    Map<String, Set<String>> getCandidateGroups(Collection<String> ids);

    /**
     * @param taskId 任务ID
     * @return java.lang.Boolean
     * @description 判断任务点是否为会签节点
     * @author junyuan.liu
     * @date 2022/8/23 11:03
     */
    Boolean isTaskMulti(String taskId);

    /**
     * @param id taskId
     * @description 重置创建时间为当前时间
     * @author junyuan.liu
     * @date 2023/2/16 14:08
     */
    void resetTaskCreateTime(String id);

    /**
     * @param taskId       taskId
     * @param variableName variableName
     * @return java.lang.Object
     * @description 运行中的任务参数
     * @author junyuan.liu
     * @date 2023/2/27 11:17
     */
    Object getVariableLocal(String taskId, String variableName);

    /**
     * @param list list
     * @return java.util.List<com.quick.develop.system.api.domain.SysUserDeptVO>
     * @description 获取用户部门
     * @author junyuan.liu
     * @date 2023/4/24 11:10
     */
    List<SysUserDeptVO> getUserDept(List<SysUserDeptVO> list);

}
